#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>


//数据在内存中的存储
//整数在内存中存储的是二进制，用原码，反码，补码来表示，内存中存储的是补码
//三种方法均有符号位和数值为两部分，符号位都是用0来表示正，用1来表示负，数值为的最高位被用作表示符号位，剩下的表示数值位

//int main()
//{
//	int a = 0x11223344;
//	//在调试内存窗口的时候，为了方便展示，显示的是16进制的值
//	//但存储的顺序是倒过来的
//	return 0;
//}
//按照字节序，分为大端存储和小段存储
//大端字节序存储
//把一个数据的低字节的内容储存到高地址处，把高位字节的内容储存在低地址处

//小端字节序存储
//把一个数据的低字节的内容存储在低地址处，把高位字节的内容存储到高地址处


//设计一个小程序来判断当前机器的字节序


//int main()
//{
//	int a = 1;
//	//1
//	//0x 00 00 00 01 
//	//小端 01 00 00 00
//	//大端 00 00 00 01
//
//	if (*((char*)&a) == 1)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//	return 0;
//}


//int check_sys()
//{
//	int a = 1;
//	// 0x 00 00 00 01
//	// 小端 01 00 00 00
//	// 大端 00 00 00 01
//	// 
//    //假设左边是低地址
//	return *((char*)&a);
//    //注意，不能
//	//char* ptr = (char*)&a
//	//因为强制类型转换会将值取出来，取出来就会影响取出的位置，大的变量强制转换成小的变量只会取出最后的地址
//}

//int main()
//{
//	int ret = check_sys();
//
//	if (ret)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//	return 0;
//}



//练习


//char到底是有符号的char还是无符号的char是取决于编译器的！
//在vs上，char = signed char
//int main()
//{
//    char a = -1;
//    //10000000000000000000000000000001 - 原码
//    //11111111111111111111111111111110 - 反码
//    //11111111111111111111111111111111 - 补码
//    // char - 1个字节 - 8个bit位，所以从低地址开始发生数据截断
//    //11111111 - a
//    //       ||
//    //      整型提升(有符号整数，用符号位来填充高位)
//    //       ||
//    //11111111111111111111111111111111
//    signed char b = -1;
//    //11111111 - b
//    //       ||
//    //      整型提升(有符号整数，用符号位来填充高位)
//    //       ||
//    //11111111111111111111111111111111
//    //
//    unsigned char c = -1;
//    //11111111 - c
//    //       ||
//    //      整型提升(无符号整数，用0来填充高位)
//    //       ||
//    //00000000000000000000000011111111
//    printf("a=%d, b=%d, c=%d", a, b, c);//%d打印，会认为内存中存的是整数
//    //       -1      -1    255
//
//    return 0;
//}

//signed char 有符号的
//unsigned char 无符号的
//char - 1个字节 - 8个Bit位
//内存中的数据，是以补码的形式存在的


//如果是signed char 类型，那么内存中的最高位就被当做符号位
//  00000000 = 0   ]
//  00000001 = 1   ]  } 
//  00000010 = 2   ]  } } 正
//  00000011 = 3   ]  }                        ||||||所以signed char类型的取值范围是 -128 ~ 127
//  00000100 = 4   ]
//  ...      = ... ]
//  01111111 = 127 ]
//  10000000 =  取反加一之后会超过八位，为了不浪费这个位置，把这个位置定成 - 128
//  10000001 = 11111110 = 111111111 = -127
//  ..... 
//  11111110 = 10000001 = 100000010 = -2
//  11111111 = 10000000 = 100000001 = -1



//unsigned char的内存
//  00000000 = 0
//  00000001 = 1              
//  00000010 = 2
//  00000011 = 3
//  00000100 = 4           ||||||对于unsigned char的取值范围是0~255
//  ...
//  ...
//  01111111 = 127
//  10000000 = 128
//  10000001 = 129
//  ...
//  ...
//  11111110 = 254
//  11111111 = 255


// int main()
//{
//    char a = -128;
//    //10000000000000000000000010000000 - 原码
//    //11111111111111111111111101111111 - 反码
//    //11111111111111111111111110000000 - 补码
//    //char是一个字节，8个bit位
//    //10000000 - a （从低地址开始发生数据截断）
//    //       ||
//    //      整型提升(有符号整数，用符号位来填充高位)
//    //       ||
//    //11111111111111111111111110000000
//    //
//    printf("%u\n", a);//结果是一个非常大的整数
//    //%u的形式打印，是认为a中存放的是无符号数
//    //a是char类型，首先要整型提升
//    //
//    return 0;
//}



//int main()
//{
//    char a = 128;///signed char 的取值范围是 -128~127 不要管取值范围，先放进去，放进去之后，128就不是128了
//    //00000000000000000000000010000000（正数的原反补码都相同）
//    //10000000 - a（数据截断）
//    //11111111111111111111111110000000（整型提升）
//    printf("%u\n", a);//结果是一个非常大的整数
//	//%u的形式打印，是认为a中存放的是无符号数，所以就不用将上面整型提升后的数的补码转换原码了
//	//a是char类型，首先要整型提升
//    
//    return 0;
//}


//int main()
//{
//	char c = -128;
//	printf("%d\n", c);//%d表示打印的是有符号整数，是认为c中存放的是有符号数
//	                  //所以会将整型提升后的数字再进行补码转换成原码的过程
//	                  //11111111111111111111111110000000
//					  //10000000000000000000000001111111
//					  //10000000000000000000000010000000
//					  //所以会正常打印 -128
//	return 0;
//}



int main()
{
    char a[1000];//0~999
    int i;
    for (i = 0; i < 1000; i++)
    {
        a[i] = -1 - i;
    }
    //-1 -2 -3 -4 ... -127 -128 127 126 ... 4 3 2 1 0 -1 -2 ...

    printf("%zd", strlen(a));//求得是字符串的长度，统计的是\0(ASCII码值是0)之前的字符个数
    //255 
    return 0;
}


